﻿using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace System
{
    /// <summary>
    /// 表示对 <see cref="System.ComponentModel.DataAnnotations"/> 的扩展。
    /// </summary>
    public static class DataAnnotationExtension
    {
        /// <summary>
        /// 获取注解属性和 <see cref="IValidatableObject"/> 实现的错误集合。
        /// </summary>
        /// <param name="model">要验证的实体。</param>
        /// <returns>若验证未通过，则返回错误集合字符串，否则为空集合。</returns>
        public static IEnumerable<string> GetErrors(this IValidatableModel model)
        {
            var context = new ValidationContext(model);
            var errorList = new List<ValidationResult>();

            if (model is IValidatableObject validatableObject)
            {
                var validatableResult = validatableObject.Validate(context);
                errorList.AddRange(validatableResult);
            }

            if (!Validator.TryValidateObject(context.ObjectInstance, context, errorList,true))
            {
                return errorList.Select(m => m.ErrorMessage);
            }
            return new List<string>();
        }
        /// <summary>
        /// 表示当前实体验证是否合法
        /// </summary>
        /// <param name="model">使用注解验证的对象扩展。</param>
        /// <returns>
        ///   若验证合法则返回 <c>true</c>；否则返回 <c>false</c>。
        /// </returns>
        public static bool IsValid(this IValidatableModel model)
            => !model.GetErrors().Any();
    }
}
